//
//  CWSportMapVC.m
//  大神专制黑马行
//
//  Created by chenWei on 2017/5/10.
//  Copyright © 2017年 陈伟. All rights reserved.
//

#import "CWSportMapVC.h"
#import <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import "CWCustomPresentAnnimation.h"
#import "CWSportMapTypeVC.h"



@interface CWSportMapVC ()<MAMapViewDelegate, UIPopoverPresentationControllerDelegate>
//总距离
@property (weak, nonatomic) IBOutlet UILabel *totalDistanceLabel;
//速度
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;

//转场控制器
@property(nonatomic, strong) CWCustomPresentAnnimation *presentAnimation;

//起点位置
@property(nonatomic, strong)CLLocation *startLocation;


@end

@implementation CWSportMapVC

- (void)awakeFromNib
{   [super awakeFromNib];
    //1.创建转场动画器
    self.presentAnimation = [[CWCustomPresentAnnimation alloc]init];
    //2.设置转场形式为自定义模式
    self.modalPresentationStyle = UIModalPresentationCustom;
    //3.设置转场代理
    self.transitioningDelegate = self.presentAnimation;
    
    //添加高德地图
    [self addMapView];
    
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
}


#pragma mark - 选择地图模式
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //1.判断目标控制器是否属于当前控制器类
    if ([segue.destinationViewController isKindOfClass:[CWSportMapTypeVC class]]) {
        //1.获取对应的控制器
        CWSportMapTypeVC *sportMapTypeVC = segue.destinationViewController;
        //2.如果是 proper 跳转，就通过sportMapTypeVC的popoverPresentationController获取poper
        UIPopoverPresentationController *poperPresentationVC = sportMapTypeVC.popoverPresentationController;
        
        //3.默认情况下，popover只有在iPAd的情况下才会显示气泡样式，在iPhone的情况下是全屏显示，这主要是因为iPhone的情况下系统对popover控制器做了一个全屏适应的处理。
        //要想在iPhone的设备上也能够显示popover气泡的样式，则需要设置pooover的代理来取消iPhone的全屏自适应
        poperPresentationVC.delegate = self;
        
        //4.设置 poper 的显示大小   如果目标控制器存在内部容器视图的情况（如：poper），则可以通过preferredContentSize来设置大小
        sportMapTypeVC.preferredContentSize = CGSizeMake(0, 100);
        
        //5.设置箭头方向
        poperPresentationVC.permittedArrowDirections = UIMenuControllerArrowDown;
        
        //6.设置目标参考点(箭头的中线点位置在sourcerect的中心点，坐标系是自身坐标系)
        //popover有一个来源视图soucreView：popover从哪一个地方弹出
        //默认情况下箭头的中心点在来源视图的原点位置（左上角），如果想让popover的箭头显示在来源视图的中线点，则只需要设置popover的目标参考矩形souceRect为来源视图的bounds属性即可
        poperPresentationVC.sourceRect = poperPresentationVC.sourceView.bounds;
        
        
        //设置当前地图样式
        sportMapTypeVC.currentIndex = self.mapView.mapType;
        //
        sportMapTypeVC.block = ^(NSInteger index) {
          
            self.mapView.mapType = index - 1;
        };
        
    }
    
}



#pragma mark - UIPopoverPresentationControllerDelegate代理

/**
 返回 poper 自适应模式
 1.该方法只是对 iPhone 有效，iPad 无效
 2.iPhone 默认情况下，返回的是全屏
 3.如果要显示气泡样式，只需要返回UIModalPresentationNone即可，表示取消自适应
 */
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection
{
    return UIModalPresentationNone;
}


#pragma mark - 添加地图
- (void)addMapView
{
    ///地图需要v4.5.0及以上版本才必须要打开此选项（v4.5.0以下版本，需要手动配置info.plist）
    [AMapServices sharedServices].enableHTTPS = YES;
    
    ///初始化地图
    self.mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    self.mapView.delegate = self;
    
    self.mapView = self.mapView;
    ///把地图添加至view
    [self.view insertSubview:self.mapView atIndex:0];
    
    //显示交通
    self.mapView.showTraffic = YES;
    //隐藏比例尺
    self.mapView.showsScale = NO;
    
    /**
     * 是否允许后台定位。默认为NO。只在iOS 9.0之后起作用。
     * 设置为YES的时候必须保证 Background Modes 中的 Location updates处于选中状态，否则会抛出异常。
     */
    self.mapView.allowsBackgroundLocationUpdates = YES;
    
    /**
     *  指定定位是否会被系统自动暂停。默认为YES。只在iOS 6.0之后起作用。
     */
    //设置自动暂停位置更新为 NO
    self.mapView.pausesLocationUpdatesAutomatically = NO;
  
    ///如果您需要进入地图就显示定位小蓝点，则需要下面两行代码
    _mapView.showsUserLocation = YES;
    //追踪模式
    _mapView.userTrackingMode = MAUserTrackingModeFollowWithHeading;
    
    //关闭3D相机旋转（只对3D地图有效，节省地图性能）
    //    mapView.rotateEnabled = NO;
}



#pragma mark - MAMapViewDelegate 地图代理
/**
 * @brief 位置或者设备方向更新后，会调用此函数
 * @param mapView 地图View
 * @param userLocation 用户定位信息(包括位置与设备方向等数据)
 * @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
 */
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    //三次滤波算法
    //所有的GPS导航设备在刚开启的时候前面几次的经纬度数据误差较大，我们一般认为这是GPS卫星的校准数据，不做任何处理
    static int i = 0;
    if (i<3) {
        i++;
        return;
    }
    
    //判断是否在更新位置
    if (updatingLocation == YES) {
        //判断是否有起点，如果没有就设置初始位置为起点
        if (!self.startLocation) {
            //让当前位置为起点位置
            self.startLocation = userLocation.location;
            
            //添加大头针
            MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];
            pointAnnotation.coordinate = userLocation.coordinate;
            pointAnnotation.title = userLocation.title;
            pointAnnotation.subtitle = userLocation.subtitle;
            [mapView addAnnotation:pointAnnotation];
            
        }
        
        //绘制轨迹线条
        [mapView addOverlay:[self.sportTrackingModel drawPolylineWithLocation:userLocation.location]];
        
        //更新 UI
        [self updateUI];
    }

    //设置当前位置为屏幕的中心点
    [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
    
}

//更新 UI
- (void)updateUI
{
    self.totalDistanceLabel.text = [NSString stringWithFormat:@"%.2f",self.sportTrackingModel.totalDistance];
    self.timeLabel.text = self.sportTrackingModel.totalTimeStr;
    
    //改变运动状态
    
    
    //判断代理方法是否执行
    if (self.delegate && [self.delegate respondsToSelector:@selector(sportMapVcWith:SportTrackingModel:)]) {
        [self.delegate sportMapVcWith:self SportTrackingModel:self.sportTrackingModel];
    }
    
}


/**
 * @brief 根据anntation生成对应的View
 * @param mapView 地图View
 * @param annotation 指定的标注
 * @return 生成的标注View
 */
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id <MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        static NSString *pointReuseIndentifier = @"pointReuseIndentifier";
        MAPinAnnotationView*annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
        if (annotationView == nil)
        {
            annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
        }
        annotationView.canShowCallout= YES;       //设置气泡可以弹出，默认为NO
        annotationView.animatesDrop = YES;        //设置标注动画显示，默认为NO
        annotationView.draggable = YES;        //设置标注可以拖动，默认为NO
        annotationView.pinColor = MAPinAnnotationColorPurple;
        
        //设置大头针图片
        annotationView.image = self.sportTrackingModel.image;
        
        //改变大头针位置偏移量,大头针往上移动图片一半的高度，让大头针下方的尖角处于默认大头针的中心点
        /**
         *  默认情况下, annotation view的中心位于annotation的坐标位置，可以设置centerOffset改变view的位置，正的偏移使view朝右下方移动，负的朝左上方，单位是像素
         */
        annotationView.centerOffset = CGPointMake(0, - self.sportTrackingModel.image.size.height/2);
        
        return annotationView;
    }
    return nil;
}


/**
 * @brief 根据overlay生成对应的Renderer
 * @param mapView 地图View
 * @param overlay 指定的overlay
 * @return 生成的覆盖物Renderer
 */
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay
{
    if ([overlay isKindOfClass:[MAPolyline class]]) {
        
        //创建遮盖物渲染器
        MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc]initWithOverlay:overlay];
        
        //强转为自定义折线模型
        CWSportPolyline *polyline = (CWSportPolyline *)overlay;
        
        //线宽
        polylineRenderer.lineWidth = 10.f;
        
        //线条颜色
        polylineRenderer.strokeColor = polyline.color;
        
        return polylineRenderer;
        
    }

    return nil;
}





@end
